Filter out events that the current window didn't select for
authorThomas Jaeger <ThJaeger@gmail.com>
Tue, 29 Sep 2009 06:14:12 +0000 (02:14 -0400)
committerAlexander Larsson <alexl@redhat.com>
Tue, 29 Sep 2009 12:44:25 +0000 (14:44 +0200)
Signed-off-by: Thomas Jaeger <ThJaeger@gmail.com>
https://bugzilla.gnome.org/show_bug.cgi?id=588649

gdk/x11/gdkinput-x11.c
gdk/x11/gdkinput-xfree.c
gdk/x11/gdkinputprivate.h

index 5f1e3df9507614aae490e1273b66ea7a89f64b14..37841b11830c89ac56ece029fd397a0f9262674c 100644 (file)
@@ -701,6 +701,55 @@ _gdk_input_common_other_event (GdkEvent         *event,
   return FALSE;                        /* wasn't one of our event types */
 }
 
+gboolean
+_gdk_input_common_event_selected (GdkEvent         *event,
+                                 GdkWindow        *window,
+                                 GdkDevicePrivate *gdkdev)
+{
+  GdkWindowObject *priv = (GdkWindowObject *) window;
+
+  switch (event->type) {
+    case GDK_BUTTON_PRESS:
+      return priv->extension_events & GDK_BUTTON_PRESS_MASK;
+
+    case GDK_BUTTON_RELEASE:
+      return priv->extension_events & GDK_BUTTON_RELEASE_MASK;
+
+    case GDK_KEY_PRESS:
+      return priv->extension_events & GDK_KEY_PRESS_MASK;
+
+    case GDK_KEY_RELEASE:
+      return priv->extension_events & GDK_KEY_RELEASE_MASK;
+
+    case GDK_MOTION_NOTIFY:
+      if (priv->extension_events & GDK_POINTER_MOTION_MASK)
+       return TRUE;
+      if (gdkdev->button_count && (priv->extension_events & GDK_BUTTON_MOTION_MASK))
+       return TRUE;
+
+      if ((gdkdev->button_state[0] & 1 << 1) && (priv->extension_events & GDK_BUTTON1_MOTION_MASK))
+       return TRUE;
+      if ((gdkdev->button_state[0] & 1 << 2) && (priv->extension_events & GDK_BUTTON2_MOTION_MASK))
+       return TRUE;
+      if ((gdkdev->button_state[0] & 1 << 3) && (priv->extension_events & GDK_BUTTON3_MOTION_MASK))
+       return TRUE;
+
+      return FALSE;
+
+    case GDK_PROXIMITY_IN:
+         return priv->extension_events & GDK_PROXIMITY_IN_MASK;
+
+    case GDK_PROXIMITY_OUT:
+         return priv->extension_events & GDK_PROXIMITY_OUT_MASK;
+
+    default:
+      return FALSE;
+  }
+
+
+}
+
+
 gboolean
 _gdk_device_get_history (GdkDevice         *device,
                         GdkWindow         *window,
index 4d590ea9cf53ef16e94cb09eaff31ef3c7b0ba17..d0f217c86e9e42188ab5ce06bfc825ea63ccaa99 100644 (file)
@@ -291,7 +291,7 @@ _gdk_input_other_event (GdkEvent *event,
       display->ignore_core_events)
     gdk_input_check_proximity (GDK_WINDOW_DISPLAY (window));
 
-  return TRUE;
+  return _gdk_input_common_event_selected(event, window, gdkdev);
 }
 
 gint
index aeb440e9e0504324d1579a39ecbf8f485584c05c..51233c77b59ec2d7141e7cb0b3a12173ff0d774d 100644 (file)
@@ -179,6 +179,9 @@ gint               _gdk_input_common_other_event        (GdkEvent         *event
                                                         XEvent           *xevent,
                                                         GdkWindow        *window,
                                                         GdkDevicePrivate *gdkdev);
+gboolean          _gdk_input_common_event_selected     (GdkEvent         *event,
+                                                        GdkWindow        *window,
+                                                        GdkDevicePrivate *gdkdev);
 
 #endif /* !XINPUT_NONE */